package dao;

import java.util.Date;
import java.util.List;
import hbt.HbtUtil;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import bean.ListaDePreciosVO;

public class HbtListaDePreciosDao {

	private static SessionFactory sf = null;
	private static HbtListaDePreciosDao instancia = null;

	public static HbtListaDePreciosDao getInstancia() {
		if (instancia == null) {
			sf = HbtUtil.getSessionFactory();
			instancia = new HbtListaDePreciosDao();
		}
		return instancia;
	}

	public void guardarListaDePrecios(ListaDePreciosVO l) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.persist(l);
		session.flush();
		session.getTransaction().commit();
		session.close();
	}

	public ListaDePreciosVO obtenerListaDePrecios(ListaDePreciosVO l) {
		Session session = sf.openSession();
		Transaction trans = session.beginTransaction();
		ListaDePreciosVO oficina = (ListaDePreciosVO) session.get(
				ListaDePreciosVO.class, l.getNro_lista());
		trans.commit();
		session.close();
		return oficina;
	}

	// /////////////////////comparativas

	@SuppressWarnings("unchecked")
	public List<Object[]> obtenerComparativa(String codigo) {
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		List<Object[]> comparativa = session
				.createQuery(
						"select I.precio, I.cantidadMinima, I.cantidadMaxima,  R.idRodamiento.codigo, R.idRodamiento.caracteristica, R.idRodamiento.marca, "
								+ "L.nro_lista, P.cuit, R.idRodamiento.origen  from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P "
								+ "where R.idRodamiento.codigo = :codigo order by I.precio ")
				.setString("codigo", codigo).list();
		session.getTransaction().commit();
		session.close();
		return comparativa;
	}

	@SuppressWarnings("unchecked")
	public List<Object[]> obtenerComparativa(String codigo, String caract) {
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		List<Object[]> comparativa = session
				.createQuery(
						"select I.precio, I.cantidadMinima, I.cantidadMaxima,  R.idRodamiento.codigo, R.idRodamiento.caracteristica, R.idRodamiento.marca, "
								+ "L.nro_lista, P.cuit, R.idRodamiento.origen  from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P "
								+ "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract order by I.precio")
				.setString("codigo", codigo).setString("caract", caract).list();
		session.getTransaction().commit();
		session.close();
		return comparativa;
	}

	@SuppressWarnings("unchecked")
	public List<Object[]> obtenerComparativa(String codigo, String caract,
			String marca) {
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		List<Object[]> comparativa = session
				.createQuery(
						"select I.precio, I.cantidadMinima, I.cantidadMaxima,  R.idRodamiento.codigo, R.idRodamiento.caracteristica, R.idRodamiento.marca, "
								+ "L.nro_lista, P.cuit, R.idRodamiento.origen  from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P "
								+ "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and R.idRodamiento.marca =:marca order by I.precio ")
				.setString("codigo", codigo).setString("caract", caract)
				.setString("marca", marca).list();
		session.getTransaction().commit();
		session.close();
		return comparativa;
	}

	@SuppressWarnings("unchecked")
	public List<Object[]> obtenerComparativa(String codigo, String caract,
			String marca, String origen) {
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		List<Object[]> comparativa = session
				.createQuery(
						"select I.precio, I.cantidadMinima, I.cantidadMaxima,  R.idRodamiento.codigo, R.idRodamiento.caracteristica, R.idRodamiento.marca, "
								+ "L.nro_lista, P.cuit, R.idRodamiento.origen  from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P "
								+ "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and R.idRodamiento.marca =:marca and R.idRodamiento.origen =:origen order by I.precio ")
				.setString("codigo", codigo).setString("caract", caract)
				.setString("marca", marca).setString("origen", origen).list();
		session.getTransaction().commit();
		session.close();
		return comparativa;
	}

	// ///////////////////// Precios

	public float obtenerMejorPrecio(int cant, Date fecha, String codigo) {
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		float result = (Float) session
				.createQuery(
						" select isnull(min(I.precio),0)  from ListaDePreciosVO L join L.items I join I.rodamiento R "
								+ "where R.idRodamiento.codigo = :codigo and (:cant between I.cantidadMinima and I.cantidadMaxima)"
								+ " and :fecha between L.vigenciaDesde and L.vigenciaHasta ")
				.setString("codigo", codigo).setInteger("cant", cant)
				.setDate("fecha", fecha).uniqueResult();
		session.getTransaction().commit();
		session.close();
		return result;
	}

	public float obtenerMejorPrecio(int cant, Date fecha, String codigo,
			String caract) {
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		float result = (Float) session
				.createQuery(
						"select isnull(min(I.precio),0)from ListaDePreciosVO L join L.items I join I.rodamiento R "
								+ "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and "
								+ ":cant between I.cantidadMinima and I.cantidadMaxima"
								+ " and :fecha between L.vigenciaDesde and L.vigenciaHasta")
				.setString("codigo", codigo).setString("caract", caract)
				.setInteger("cant", cant).setDate("fecha", fecha)
				.uniqueResult();
		session.getTransaction().commit();
		session.close();
		return result;
	}

	public float obtenerMejorPrecio(int cant, Date fecha, String codigo,
			String caract, String marca) {
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		float item = (Float) session
				.createQuery(
						"select isnull(min(I.precio),0) from ListaDePreciosVO L join L.items I join I.rodamiento R "
								+ "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and "
								+ "R.idRodamiento.marca =:marca and"
								+ ":cant between I.cantidadMinima and I.cantidadMaxima"
								+ " and :fecha between L.vigenciaDesde and L.vigenciaHasta")
				.setString("codigo", codigo).setString("caract", caract)
				.setString("marca", marca).setInteger("cant", cant)
				.setDate("fecha", fecha).uniqueResult();
		session.getTransaction().commit();
		session.close();
		return item;
	}

	public float obtenerMejorPrecio(int cant, Date fecha, String codigo,
			String caract, String marca, String origen) {
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();

		float result = (Float) session
				.createQuery(
						"select isnull(min(I.precio),0) from ListaDePreciosVO L join L.items I join I.rodamiento R "
								+ "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and "
								+ "R.idRodamiento.marca =:marca and R.idRodamiento.origen =:origen and "
								+ ":cant between I.cantidadMinima and I.cantidadMaxima"
								+ " and :fecha between L.vigenciaDesde and L.vigenciaHasta")
				.setString("codigo", codigo).setString("caract", caract)
				.setString("marca", marca).setString("origen", origen)
				.setInteger("cant", cant).setDate("fecha", fecha)
				.uniqueResult();
		session.getTransaction().commit();
		session.close();
		return result;
	}

	// //////////////////////////////Proveedor

	public String obtenerProveedor(int cant, float precio, Date fecha,
			String codigo, String caract, String marca, String origen)

	{
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();

		String result = (String) session
				.createQuery(
						"select P.cuit from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P "
								+ "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and "
								+ "R.idRodamiento.marca =:marca and R.idRodamiento.origen =:origen and "
								+ ":cant between I.cantidadMinima and I.cantidadMaxima and I.precio = :precio "
								+ "and :fecha between L.vigenciaDesde and L.vigenciaHasta")
				.setString("codigo", codigo).setString("caract", caract)
				.setString("marca", marca).setString("origen", origen)
				.setInteger("cant", cant).setFloat("precio", precio)
				.setDate("fecha", fecha).setFirstResult(0).setMaxResults(1)
				.uniqueResult();
		session.getTransaction().commit();
		session.close();
		return result;
	}

	public String obtenerProveedor(int cant, float precio, Date fecha,
			String codigo, String caract, String marca)

	{
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();

		String result = (String) session
				.createQuery(
						"select P.cuit from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P "
								+ "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and "
								+ "R.idRodamiento.marca =:marca and "
								+ ":cant between I.cantidadMinima and I.cantidadMaxima and I.precio = :precio "
								+ "and :fecha between L.vigenciaDesde and L.vigenciaHasta")
				.setString("codigo", codigo).setString("caract", caract)
				.setString("marca", marca).setInteger("cant", cant)
				.setFloat("precio", precio).setDate("fecha", fecha)
				.setFirstResult(0).setMaxResults(1).uniqueResult();
		session.getTransaction().commit();
		session.close();
		return result;
	}

	public String obtenerProveedor(int cant, float precio, Date fecha,
			String codigo, String caract)

	{
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();

		String result = (String) session
				.createQuery(
						"select P.cuit from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P "
								+ "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and "
								+ ":cant between I.cantidadMinima and I.cantidadMaxima and I.precio = :precio "
								+ "and :fecha between L.vigenciaDesde and L.vigenciaHasta")
				.setString("codigo", codigo).setString("caract", caract)
				.setInteger("cant", cant).setFloat("precio", precio)
				.setDate("fecha", fecha).setFirstResult(0).setMaxResults(1)
				.uniqueResult();
		session.getTransaction().commit();
		session.close();
		return result;
	}

	public String obtenerProveedor(int cant, float precio, Date fecha,
			String codigo)

	{
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();

		String result = (String) session
				.createQuery(
						"select P.cuit from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P "
								+ "where R.idRodamiento.codigo = :codigo and "
								+ ":cant between I.cantidadMinima and I.cantidadMaxima and I.precio = :precio "
								+ "and :fecha between L.vigenciaDesde and L.vigenciaHasta")
				.setString("codigo", codigo).setInteger("cant", cant)
				.setFloat("precio", precio).setDate("fecha", fecha)
				.setFirstResult(0).setMaxResults(1).uniqueResult();
		session.getTransaction().commit();
		session.close();
		return result;
	}
}
